package controller

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"myproject/model"
	"myproject/schemas"
	"myproject/utils"
	"net/http"
	"net/url"
	"regexp"
	"strconv"
)

// 总的路由分发
func UserRegister(userGrp *gin.RouterGroup) {
	userGrp.Use().POST("/sendcode", sendcode)
	userGrp.Use().POST("/registers", registers)
	//微博连接
	userGrp.Use().GET("/getWeibo", getWeibo)
	//微博回调
	userGrp.Use().GET("/weiboCallback", weiboCallback)

	userGrp.Use().POST("/bindMobile", bindMobile)
}

// 发送验证码
func sendcode(c *gin.Context) {
	//获取手机号  返回的是一个字符串
	addStu := &schemas.Users{}
	//绑定参数
	_ = c.Bind(addStu)
	//直接使用
	stu := &model.User{
		Mobile: addStu.Mobile,
	}
	//mobile := c.PostForm("moile")
	//验证手机号是否合法 \\转义符 regexp正则表达式
	res := "^1[3-9]{1}\\d{9}$"
	result := regexp.MustCompile(res)
	flag := result.MatchString(addStu.Mobile)
	fmt.Println(stu)
	fmt.Println(flag)
	if !flag {
		c.JSON(200, gin.H{
			"code": "10011",
			"msg":  "手机号不合法",
		})
	} else {
		//从redis中根据手机号获取验证码
		r := utils.GetRedis()
		value := r.Get(addStu.Mobile)
		if value == "" {
			// 如果不存在生成随机数
			code := utils.RandInt(10000, 99999)
			//存入redis  手机号，时间，验证码
			r.Setex(addStu.Mobile, 60, code)
			//调用发短信的接口
			utils.Sendsms(addStu.Mobile, strconv.Itoa(code))
			//返回结果
			c.JSON(200, gin.H{
				"code": 200,
				"msg":  "发送成功",
			})
		} else {
			//如果存在直接返回不能重复发
			c.JSON(200, gin.H{
				"code": "10012",
				"msg":  "不能重复发送",
			})
		}

	}

}

// 注册登录
func registers(c *gin.Context) {
	//获取参数
	suser := &schemas.Users{}
	_ = c.Bind(suser)
	fmt.Println("111", suser.Mobile)
	//验证码获取
	r := utils.GetRedis()
	////获取redis中的验证码
	code := r.Get(suser.Mobile)
	fmt.Println(code)
	if code != suser.Code {
		c.JSON(200, gin.H{
			"code": "10200",
			"mes":  "验证不正确",
		})
	} else {
		//加入数据库
		user := &model.User{
			Mobile:   suser.Mobile,
			Password: "111",
		}
		db := model.GetDb()
		db.Create(&user)
		//生成token返回
		token, _ := utils.ReleaseToken(user.ID)
		c.JSON(200, gin.H{
			"code":   200,
			"mes":    "注册成功",
			"userid": user.ID,
			"token":  token,
		})
	}

}

// 获取微博连接
func getWeibo(c *gin.Context) {
	//微博唯一标识
	clientid := "3674019597"
	//回调地址
	url := "http://127.0.0.1:8000/user/weiboCallback/"

	returnUrl := "https://api.weibo.com/oauth2/authorize?client_id=" + clientid + "&redirect_uri=" + url + "&response_type=code"
	c.JSON(200, gin.H{
		"code": 200,
		"url":  returnUrl,
	})
}

// 微博回调
func weiboCallback(c *gin.Context) {
	////获取code
	code := c.Query("code")
	//组装数据post请求验证
	geturl := "https://api.weibo.com/oauth2/access_token"
	data := url.Values{}
	data.Add("client_id", "3674019597")
	data.Add("client_secret", "7ae99bc0d54ead29fc8d1b9fabd78587")
	data.Add("grant_type", "authorization_code")
	data.Add("redirect_uri", "http://127.0.0.1:8000/user/weiboCallback/")
	data.Add("code", code)
	res, _ := http.PostForm(geturl, data)

	//成功 uid ,token

	body, _ := ioutil.ReadAll(res.Body)

	var v interface{}
	json.Unmarshal([]byte(string(body)), &v)
	resultmes := v.(map[string]interface{})
	actoken, flag := resultmes["access_token"]
	if flag {
		fmt.Println(actoken)
	}
	uid, uflag := resultmes["uid"]
	if uflag {
		fmt.Println(uid)
	}

	//通过 uid去三方登录表中查询是否存在
	//uid := "123"
	sf := &model.SfLogin{}
	list := model.GetDb().Table("sf_logins").Where("userid=?", uid).Find(sf).RowsAffected
	//如果存在用userid生成token，redirect到vue页面
	if list == 0 {
		//生成token返回
		//如果不存子啊跳转到vue页面进行手机号的绑定
		//将interface{}强转成string
		uid1 := fmt.Sprintf("%v", uid)
		actoken1 := fmt.Sprintf("%v", actoken)

		c.Redirect(http.StatusMovedPermanently, "http://localhost:8080/zhong?token="+actoken1+"&userid="+uid1)
		fmt.Println("123", uid1)
		fmt.Println("321", actoken1)
	} else {
		usertoken, _ := utils.ReleaseToken(sf.Uid)
		//如果存在用serid生成token，redirect到vue页面
		tourl := "http://localhost:8080/zhu?uid=" + strconv.Itoa(int(sf.Uid)) + "&token=" + usertoken
		c.Redirect(http.StatusMovedPermanently, tourl)

	}
}

func bindMobile(c *gin.Context) {
	createUser := &schemas.SfLogin{}
	_ = c.Bind(createUser)
	token := createUser.Token
	mobile := createUser.Mobile
	uid := createUser.Userid
	//查询用户表中的此手机号是否存在
	var user model.User
	conn := model.GetDb()
	conn.First(&user, "mobile=?", mobile)
	//已经存在找出Userid,写入三方登录表
	var ctokenuserid uint = 0
	if user.ID != 0 {
		//生成token返回
		ctokenuserid = user.ID
	} else {
		//不存在先写用户表，生成一个userid，再写三方登录表
		createUser := &model.User{
			Mobile: mobile,
		}
		conn.Create(createUser)
		ctokenuserid = createUser.ID
	}
	ctoken, _ := utils.ReleaseToken(ctokenuserid)
	//写入三方登录表
	sflogin := &model.SfLogin{
		Uid:      ctokenuserid,
		Token:    token,
		PlatForm: "weibo",
		Userid:   uid,
	}
	conn.Create(sflogin)
	c.JSON(200, gin.H{
		"code":   200,
		"token":  ctoken,
		"userid": ctokenuserid,
	})
}

//如果不存在跳转到vue页面进行手机号的绑定

//func bindMoobile(c *gin.Context) {
//	sflogin := &model.SfLogin{}
//	_ = c.Bind(sflogin)
//	lo := &schemas.SfLogin{}
//	fmt.Println(lo)
//	//查询用户表中的此手机号是否存在
//	var user model.User
//	conn := model.GetDb()
//	conn.First(&user, "mobile=?", lo.Mobile)
//	// 已经存在找出userid，写入三方模块
//	var ctokenuserid uint = 0
//	if user.ID != 0 {
//		//生成token返回
//		ctokenuserid = user.ID
//	} else {
//		createUser := &model.User{
//			Mobile: lo.Mobile,
//		}
//		conn.Create(createUser)
//		ctokenuserid = createUser.ID
//	}
//	croken, _ := utils.ReleaseToken(ctokenuserid)
//	//写入三方登录表
//	sflogins := &model.SfLogin{
//		Uid:      ctokenuserid,
//		Token:    lo.Token,
//		PlatForm: "weibo",
//		Userid:   lo.Userid,
//	}
//	conn.Create(sflogins)
//	c.JSON(200, gin.H{
//		"code":   200,
//		"token":  croken,
//		"userid": ctokenuserid,
//	})
//
//}
